#include "cwhs.h"
#include "aos.h"
#include <QTextStream>
#include <QFile>
#include <QFontDatabase>
#include <QPushButton>
//#include <QtDebug>

// Алгоритм проверки принадлежности точки многоугольнику согласно теоремы Жордана
// аналог см. QPolygon::intersects(const QPolygon &p)
bool ptInPoly(QPoint pt, QPolygon pl)
{
    int c = 0;
    int n = pl.count();
    QPoint pi,pj;
    for (int i = 0, j = n - 1; i < n; j = i++ )   {
        pi = pl.point(i);
        pj = pl.point(j);
        if ((((pi.y() <= pt.y()) && (pt.y() < pj.y())) || ((pj.y() <= pt.y()) && (pt.y() < pi.y()))) &&
            (pt.x() < (pj.x() - pi.x()) * (pt.y() - pi.y()) /
             (pj.y() - pi.y())+pi.x()))  c = !c; // вкниге опечатка ? (надо проверить последнее выражение)
    } // вроде работает!

    return c != 0;
}
QString WINDOW_ENUM(short kod)
{
    QString str;
    switch(kod) {
    case 0: str = "ОКНО ФОРМАТА DUM"; break; // WINDOW_DUM
    case 1: str = "ОКНО ФОРМАТА BMP"; break; // WINDOW_BMP
    case 2: str = "ОКНО ФОРМАТА WMF"; break; // WINDOW_WMF
    case 3: str = "ОКНО ФОРМАТА TCI"; break; // WINDOW_TCI
    case 4: str = "ОКНО ФОРМАТА DYN"; break; // WINDOW_DYN
    case 5: str = "ОКНО ФОРМАТА AVI"; break; // WINDOW_AVI
    default: str = "Неизвестный тип окна"; //
    }
    return str;
}
QString WINOBJ_FENUM(short kod)
{
    QString str;
    switch(kod) {
    case 1: str = "Пиктограмма"; break; // WINOBJ_ICON
    case 3: str = "Метафайл"; break; // WINOBJ_METAFILE
    case 4: str = "Файл TCI"; break; //WINOBJ_TCIFILE
    case 20: str = "Вектор ориентации"; break; // WINOBJ_VECTOR
    case 21: str = "Символ"; break; // WINOBJ_SYMBOL
    case 23: str = "Прямоугольник поли"; break; // WINOBJ_RECPOLY

    case 2: str = "Файл BMP"; break; // WINOBJ_BITMAP
    case 5: str = "Прямоугольник"; break; // WINOBJ_RECTANGLE
    case 6: str = "Скругленный прямоугольник"; break; // WINOBJ_ROUND
    case 7: str = "Эллипс"; break; // WINOBJ_ELLIPSE
    case 8: str = "Дуга эллипса"; break; // WINOBJ_EARC
    case 9: str = "Сектор эллипса"; break; // WINOBJ_EPIE
    case 10: str = "Сегмент эллипса"; break; // WINOBJ_ECHORD
    case 11: str = "Окружность"; break; // WINOBJ_CIRCLE
    case 12: str = "Дуга окружности"; break; // WINOBJ_CARC
    case 13: str = "Сектор окружности"; break; // WINOBJ_CPIE
    case 14: str = "Сегмент окружности"; break; // WINOBJ_CCHORD
    case 15: str = "Отрезок прямой линии"; break; //WINOBJ_LINE
    case 16: str = "Полигон"; break; // WINOBJ_POLYGON
    case 17: str = "Полилайн"; break; // WINOBJ_POLYLINE
    case 18: str = "Текстовая строка"; break; // WINOBJ_STRING
    case 19: str = "Текст"; break; // WINOBJ_TEXT
    case 22: str = "Файл JPG"; break; // WINOBJ_JPG
    default: str = "Неизвестный объект"; // WINOBJ_UNKNOWN
    }
    return str;
}

QStringList fkurs;

CWhs::CWhs()
{
    int ix = QFontDatabase::addApplicationFont("/home/peter/d/Distribs/30SM_LS/EXE/FNT/!!!KURS.ttf");
    fkurs = QFontDatabase::applicationFontFamilies(ix);
//    for(int i = 0; i < fkurs.count(); i++)   qDebug() << "fkurs = " << fkurs.at(i) ;

    obj.clear(); // Указатель на первый объект Whs
    ArrayStr.clear();
    Array = nullptr;
    ArrayPointsh = nullptr;
    ArrayFont = nullptr;
    ArrayTrace = nullptr;
    ArrayBt = nullptr;
    ArrayStrBt.clear();
    but.clear();
    ArrayFl = nullptr;
    hlight = 0; // Код подсвечиваемого объекта
}
CWhs::~CWhs()
{
    obj.clear();
    ArrayStr.clear();
    if(Array != nullptr) delete Array;
    if(ArrayPointsh != nullptr) delete ArrayPointsh;
    if(ArrayFont != nullptr) delete ArrayFont;
    if(ArrayTrace != nullptr) delete ArrayTrace;
    if(ArrayBt != nullptr) delete ArrayBt;
    but.clear();
    ArrayStrBt.clear();
    if(ArrayFl != nullptr) delete ArrayFl;
}
bool CWhs::dumpWhs()
{
    QString str = gensh.szWHSFile;
    str.replace(str.count() - 3, 3, "log");
    QFile file("/home/peter/d/Distribs/30SM_LS/logWhs/" + str);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return false;
    QTextStream out(&file);

    out << "WHSHEADER: (size "<< sizeof (WHSHEADER) << ")\n";
    str = "Метка формата файла: "; out << str  <<  header.wLabel[0]  <<  header.wLabel[1] << "\n";
    str = "Версия N: "; out << str << header.iVersion << "\n";

    out << "\nWIND_GENSH: (size "<< sizeof (WIND_GENSH) << ")\n";
    str = "Координаты окна (pntLocation): "; out << str << gensh.pntLocation[0] << ","<< gensh.pntLocation[1]  << "\n";
    str = "Размер окна (siSize): "; out << str << gensh.siSize[0] << ","<< gensh.siSize[1]  << "\n";
    str = "Код формата окна (iFormat): "; out << str << gensh.iFormat << " ";
    str = WINDOW_ENUM(gensh.iFormat); out << str << "\n";
    str = "Код идентификации окна (iIdentification): "; out << str << gensh.iIdentification << "\n";
    str = "Количество видов (iViews): "; out << str << gensh.iViews << "\n";
    str = "Номер текущего вида (iView): "; out << str << gensh.iView << "\n";
    str = "Идентификатор последнего объекта (iLastObject): "; out << str << gensh.iLastObject << "\n";
    str = "Позиция в группе окон (iDesktop): "; out << str << gensh.iDesktop << "\n";
    str = "Дескриптор окна (hGeneral): "; out << str << gensh.hGeneral << "\n";
    str = "Дескриптор списка кнопок (hButtons): "; out << str << gensh.hButtons << "\n";
    str = "Дескриптор списка объектов (hObjects): "; out << str << gensh.hObjects << "\n";
    str = "Индекс объекта для подсветки (iHighlighted): "; out << str << gensh.iHighlighted << "\n";
    str = "Дескриптор пиктограммы (hIcon): "; out << str << gensh.hIcon << "\n";
    str = "Имя файла пиктограммы (szIcon[14]): "; out << str << gensh.szIcon << "\n";
    str = "Имя фонового файла окна (szFile[14]): "; out << str << gensh.szFile << "\n";
    str = "Имя файла WHS (szWHSFile[64]): "; out << str << gensh.szWHSFile << "\n";
    str = "Заголовок окна (szTitle[128]): "; out << str << gensh.szTitle << "\n";
    str = "Поле индикаторов (Flags): 0x"; out << str  << QString::number(gensh.Flags, 16).toUpper() << "\n";
    str = "Индекс фонового цвета (bBackground): "; out << str << gensh.bBackground << "\n";
    str = "Индекс группы окон (bDesktopIndex): "; out << str << gensh.bDesktopIndex << "\n";
    str = "Список файлов FLI (hAnimations): "; out << str << gensh.hAnimations << "\n";
    str = "Дескриптор объекта RTE TE (hRTE): "; out << str << gensh.hRTE << "\n";
    str = "Стартовый режим RTE (iRTEmode): "; out << str << gensh.iRTEmode << "\n";
    str = "Резервируемое слово (wReserved): "; out << str << gensh.wReserved << "\n";

    int lsize;
    if(gensh.hButtons) { // Есть список кнопок
        out << "\nButtons\n";
        str = "Количество wCounterB = "; out << str << wCounterB << "\n";
        str = "Размер элемента внешний  wSizeshB = "; out << str << wSizeshB << "\n";
        str = "Размер приращения при вставке wIncreaseB =  "; out << str << wIncreaseB << "\n";
        lsize =  (int)wCounterB * (int)wSizeshB;
        out << "ArrayBt: wCounterB * wSizeshB (size "<< lsize << ")\n";
        WINBTNSH2* par = (WINBTNSH2*)ArrayBt;
        short n = 0;
        for(int i = 0; i < wCounterB; i++) {
            str = "\nКнопка N: "; out << str << QString::number(i+1) << "\n";
            str = "Код объекта (iCode): "; out << str << QString::number(par[i].iCode) << "\n";
            str = "Код идентификации объекта (iIdentification): "; out << str << QString::number(par[i].iIdentification) << "\n";
            str = "Код вида объектов (iView): "; out << str << QString::number(par[i].iView) << "\n";
            str = "Имя файла (szFile[36]): "; out << str; str = par[i].szFile; out << str << "\n";
            str = "Координаты кнопки (pntLocation) "; out << str;
            out << QString::number(par[i].x) << "," << QString::number(par[i].y) << "\n";
            str = "Размеры кнопки (sizSize): "; out << str;
            out << QString::number(par[i].cx) << "," << QString::number(par[i].cy) << "\n";
            str = "Дескриптор кнопки (hButton): "; out << str << QString::number(par[i].hButton) << "\n";
            str = "Дескриптор текстовой строки (hText): "; out << str << QString::number(par[i].hText) << "\n";
            str = "Длина текстовой строки (iText): "; out << str << QString::number(par[i].iText) << "\n";
            if(par[i].iText != 0) {
                out << "\""  << ArrayStrBt[n++] << "\"\n";
            }
            str = "Поле индикаторов (Flags): 0x"; out << str  << QString::number(par[i].Flags, 16).toUpper() << "\n";
            str = "Фонт кнопки : "; out << str;
            str = par[i].lgFont.lfFaceName;
            out << str << " (lfHeight = " << QString::number(par[i].lgFont.lfHeight) << ", ";
            out << " lfWidth = " << QString::number(par[i].lgFont.lfWidth) << ", ";
            out << " lfEscape = " << QString::number(par[i].lgFont.lfEscape) << ", ";
            out << " lfOrient = " << QString::number(par[i].lgFont.lfOrient) << ", ";
            out << " lfWeight = " << QString::number(par[i].lgFont.lfWeight) << ", ";
            out << " lfItalic = " << QString::number(par[i].lgFont.lfItalic) << ")\n";
            str = "Цвет рамки (bFrame): "; out << str << QString::number(par[i].bFrame) << "\n";
            str = "Фоновый цвет кнопки (bBackgroundUp): "; out << str << QString::number(par[i].bBackgroundUp) << "\n";
            str = "Фоновый цвет кнопки (bBackgroundDown): "; out << str << QString::number(par[i].bBackgroundDown) << "\n";
            str = "Цвет текста (bTextUp): "; out << str << QString::number(par[i].bTextUp) << "\n";
            str = "Цвет текста (bTextDown): "; out << str << QString::number(par[i].bTextDown) << "\n";
            str = "Резервируемый байт (bReserved): "; out << str << QString::number(par[i].bReserved) << "\n";
        }
    }

    if(gensh.hObjects) { // Есть список объектов
        out << "\nObjects\n";
        str = "Количество объектов wCounter = "; out << str << wCounter << "\n";
        str = "Размер элемента внешний  wSizesh = "; out << str << wSizesh << "\n";
        str = "Размер приращения при вставке wIncrease =  "; out << str << wIncrease << "\n";
        lsize =  (int)wCounter * (int)wSizesh;
        out << "Array: wCounter * wSizesh (size "<< lsize << ")\n";
    }
    double a,b;
    char* points = ArrayPointsh;
    short* ptsh;
    WINOBJSH3* par = (WINOBJSH3*)Array;
    short n = 0;
    for(int i = 0; i < wCounter; i++) {
        str = "\nОбъект N: "; out << str << QString::number(i+1) << "\n";
        str = "Имя файла (szFile[36]): "; out << str; str = par[i].szFile; out << str << "\n";
        str = "Код объекта (iCode): "; out << str << QString::number(par[i].iCode); str = WINOBJ_FENUM(par[i].iCode);
        out <<" " << str << "\n";
        str = "Координаты верхнего угла (x,y) "; out << str;
        out << QString::number(par[i].x) << "," << QString::number(par[i].y) << "\n";
        str = "Размеры объекта (sizSize): "; out << str;
        out << QString::number(par[i].sizSize[0]) << "," << QString::number(par[i].sizSize[1]) << "\n";
        str = "Шаг размещения (sizSteps): "; out << str;
        out << QString::number(par[i].sizSteps[0]) << "," << QString::number(par[i].sizSteps[1]) << "\n";
        str = "Количество объектов (iCounter): "; out << str << QString::number(par[i].iCounter) << "\n";
        str = "Номер объекта в таблице (hObject): "; out << str << QString::number(par[i].hObject) << "\n";
        str = "Дескриптор строки (hText): "; out << str << QString::number(par[i].hText) << "\n";
        str = "Длина строки (iText): "; out << str << QString::number(par[i].iText) << "\n";

        if((par[i].iCode == 18) || (par[i].iCode == 19)) { // Текстовая строка или Текст
            str = ArrayFont[i].lfFaceName;
            out << "Font : " << str << " (lfHeight = " << QString::number(ArrayFont[i].lfHeight) << ", ";
            out << " lfWidth = " << QString::number(ArrayFont[i].lfWidth) << ", ";
            out << " lfEscape = " << QString::number(ArrayFont[i].lfEscape) << ", ";
            out << " lfOrient = " << QString::number(ArrayFont[i].lfOrient) << ", ";
            out << " lfWeight = " << QString::number(ArrayFont[i].lfWeight) << ", ";
            out << " lfItalic = " << QString::number(ArrayFont[i].lfItalic) << ")\n ";
        }
        if(par[i].iText != 0) {
            out << "\""  << ArrayStr[n++] << "\"\n";
        }
        str = "Позиция при редактировании (iSelect): "; out << str << QString::number(par[i].iSelect) << "\n";
        str = "Код идентификации объекта (iIdentification): "; out << str << QString::number(par[i].iIdentification) << "\n";
        str = "Код вида объектов (iView): "; out << str << QString::number(par[i].iView) << "\n";
        str = "Количество точек (iPolyline): "; out << str << QString::number(par[i].iPolyline) << "\n";

        if(par[i].iPolyline) {
            ptsh = (short*)points;
            str = "Точки:";
            for(int k = 0; k < par[i].iPolyline; k++) {
                str += " (" + QString::number(ptsh[0]) + "," + QString::number(ptsh[1]) + ")";
                ptsh++; ptsh++;
            }
            out << str << "\n";
            lsize = par[i].iPolyline*sizeof(short)*2;
            points += lsize;
        }

        str = "Поле индикаторов (Flags): 0x"; out << str  << QString::number(par[i].Flags, 16).toUpper() << "\n";
        str = "Дескриптор траектории (hTrace): "; out << str << QString::number(par[i].hTrace) << "\n";
        str = "Дескриптор оригинала (hOriginal): "; out << str << QString::number(par[i].hOriginal) << "\n";
        str = "Резервируемые дескрипторы (wCopy): "; out << str << QString::number(par[i].wCopy) << "\n";
        str = "Цвет пера (bFrameColor): "; out << str << QString::number(par[i].bFrameColor) << "\n";
        str = "Стиль пера (bFrameStyle): "; out << str << QString::number(par[i].bFrameStyle) << "\n";
        str = "Цвет кисти (bFillColor): "; out << str << QString::number(par[i].bFillColor) << "\n";
        str = "Фоновый цвет (bBackground): "; out << str << QString::number(par[i].bBackground) << "\n";
        str = "Стиль кисти (bFillStyle): "; out << str << QString::number(par[i].bFillStyle) << "\n";
        str = "Толщина пера (bWidth): "; out << str << QString::number(par[i].bWidth) << "\n";
        str = "Цвет текста (bTextColor): "; out << str << QString::number(par[i].bTextColor) << "\n";
        str = "Резервируемый байт (bReserved): "; out << str << QString::number(par[i].bReserved) << "\n";
        str = "Координаты левого верхнего угла источника (xSrc, ySrc): "; out << str;
        out << QString::number(par[i].xSrc) << "," <<QString::number(par[i].ySrc) << "\n";
        str = "Центр вращения объекта (pCentre): "; out << str;
        out << QString::number(par[i].pCentre[0]) << "," <<QString::number(par[i].pCentre[1]) << "\n";
        str = "(dScale): "; out << str << QString::number(par[i].dScale, 'f', 2) << "\n";
        str = "Угол поворота объекта (dAngle, fAngleStart, fAngleEnd): "; out << str;
        a = par[i].fAngleStart; b = par[i].fAngleEnd;
        if(par[i].fAngleStart > 360.) a = 0.;
        if(par[i].fAngleEnd > 360.) b = 0.;
        out << QString::number(par[i].dScale, 'f', 2) << "," <<QString::number(a, 'f', 2)<< "," <<QString::number(b, 'f', 2) << "\n";
        if(par[i].iCode == 21) { // WINOBJ_SYMBOL
            out << "WINOBJ_SYMBOL" <<  "\n";
        }
        else {
            str = "Координаты точек (Points[4]): "; out << str;
            out << "(" << QString::number(par[i].Points[0]) << "," <<QString::number(par[i].Points[1]) << ") ";
            out << "(" << QString::number(par[i].Points[2]) << "," <<QString::number(par[i].Points[3]) << ") ";
            out << "(" << QString::number(par[i].Points[4]) << "," <<QString::number(par[i].Points[5]) << ") ";
            out << "(" << QString::number(par[i].Points[5]) << "," <<QString::number(par[i].Points[7]) << ")\n";
        }
        out << "pBrushstart (x,y): " << QString::number(par[i].pBrushstart[0]) << "," <<QString::number(par[i].pBrushstart[1]) << "\n";
        out << "pBrushend (x,y): " << QString::number(par[i].pBrushend[0]) << "," <<QString::number(par[i].pBrushend[1]) << "\n";
        str = "dScale_Y, dScaleFocusX, dScaleFocusY : "; out << str;
        out << QString::number(par[i].dScale_Y, 'f', 2) << "," <<QString::number(par[i].dScaleFocusX, 'f', 2) << ","
            << QString::number(par[i].dScaleFocusY, 'f', 2) << "\n";
        str = "Цвет кисти (bFillColorBr): "; out << str << QString::number(par[i].bFillColorBr) << "\n";
        str = "Фоновый цвет (bBackgroundBr): "; out << str << QString::number(par[i].bBackgroundBr) << "\n";
        str = "Код выравнивания строки (bStringAlignment): "; out << str << QString::number(par[i].bStringAlignment) << "\n";
        str = "Прозрачность пера (bPenBr): "; out << str << QString::number(par[i].bPenBr) << "\n";
        str = "dwVersion_obj: "; out << str << QString::number(par[i].dwVersion_obj) << "\n";
        str = "Цвет пера (bFrameColorA,R,G,B): "; out << str;
        out << QString::number(par[i].bFrameColorA) << "," <<QString::number(par[i].bFrameColorR) << ",";
        out << QString::number(par[i].bFrameColorG) << "," <<QString::number(par[i].bFrameColorB) << "\n";
        str = "Цвет кисти (bFillColorA,R,G,B): "; out << str;
        out << QString::number(par[i].bFillColorA) << "," <<QString::number(par[i].bFillColorR) << ",";
        out << QString::number(par[i].bFillColorG) << "," <<QString::number(par[i].bFillColorB) << "\n";
        str = "Цвет фона (bBackgroundA,R,G,B): "; out << str;
        out << QString::number(par[i].bBackgroundA) << "," <<QString::number(par[i].bBackgroundR) << ",";
        out << QString::number(par[i].bBackgroundG) << "," <<QString::number(par[i].bBackgroundB) << "\n";
        str = "Цвет текста (bTextColorA,R,G,B): "; out << str;
        out << QString::number(par[i].bTextColorA) << "," <<QString::number(par[i].bTextColorR) << ",";
        out << QString::number(par[i].bTextColorG) << "," <<QString::number(par[i].bTextColorB) << "\n";
        str = "wFrameColorOtt, wFillColorOtt, wBackgroundOtt, wTextColorOtt: "; out << str;
        out << QString::number(par[i].wFrameColorOtt) << "," <<QString::number(par[i].wFillColorOtt) << ",";
        out << QString::number(par[i].wBackgroundOtt) << "," <<QString::number(par[i].wTextColorOtt) << "\n";
        str = "bFrameColorCont, bFillColorCont, bBackgroundCont, bTextColorCont: "; out << str;
        out << QString::number(par[i].bFrameColorCont) << "," <<QString::number(par[i].bFillColorCont) << ",";
        out << QString::number(par[i].bBackgroundCont) << "," <<QString::number(par[i].bTextColorCont) << "\n";
        str = "bFrameColorBright, bFillColorBright, bBackgroundBright, bTextColorBright: "; out << str;
        out << QString::number(par[i].bFrameColorBright) << "," <<QString::number(par[i].bFillColorBright) << ",";
        out << QString::number(par[i].bBackgroundBright) << "," <<QString::number(par[i].bTextColorBright) << "\n";
        out << "wFrame, wFrameCount: " << QString::number(par[i].wFrame) << "," <<QString::number(par[i].wFrameCount) << "\n";
        out << "wDever, wDever2: " << QString::number(par[i].wDever) << "," <<QString::number(par[i].wDever2) << "\n";
        str = "Имя файла (szReserved[32]): "; out << str; str = par[i].szReserved; out << str << "\n";
    }

    if(gensh.hAnimations) { // Есть список файлов FLI
        out << "\nAnimations\n";
        str = "Количество wCounterF = "; out << str << wCounterF << "\n";
        str = "Размер элемента внешний  wSizeshF = "; out << str << wSizeshF << "\n";
        str = "Размер приращения при вставке wIncreaseF =  "; out << str << wIncreaseF << "\n";
        lsize =  (int)wCounterF * (int)wSizeshF;
        out << "ArrayFl: wCounterF * wSizeshF (size "<< lsize << ")\n";
        Window_Animation* pan = (Window_Animation*)ArrayFl;
        for(int i = 0; i < wCounterF; i++) {
            str = "\nОбъект N: "; out << str << QString::number(i+1) << "\n";
            str = "Код идентификации объекта (iIdentification): "; out << str << QString::number(pan[i].iIdentification) << "\n";
            str = "Код вида объекта (iView): "; out << str << QString::number(pan[i].iView) << "\n";
            str = "Имя файла (szFile[56]): "; out << str; str = pan[i].szFile; out << str << "\n";
            str = "Имя файла (szFileFon[56]): "; out << str; str = pan[i].szFileFon; out << str << "\n";
            str = "Координаты (pntLocation) "; out << str;
            out << QString::number(pan[i].pntLocation[0]) << "," << QString::number(pan[i].pntLocation[1]) << "\n";
            str = "Размеры объекта (sizSize): "; out << str;
            out << QString::number(pan[i].sizSize[0]) << "," << QString::number(pan[i].sizSize[1]) << "\n";
        }
    }

    str = "\nРазмер объекта RTE = "; out << str << Rte << "\n";
    file.close();
    return true;
}
bool CWhs::loadWhs(QString FileName)
{
    QFile file(FileName);
    if(!file.open(QIODevice::ReadOnly)) return false;
    if(file.read((char*)&header, sizeof(WHSHEADER)) < 1) return false;
    file.read((char*)&gensh, sizeof(WIND_GENSH));

    wCounterB = wSizeshB = wIncreaseB = 0;
    if(gensh.hButtons) { // Есть список кнопок
        file.read((char*)&wCounterB, 2);  // Количество элементов
        file.read((char*)&wSizeshB, 2); // Размер элемента внешний
        file.read((char*)&wIncreaseB, 2); // Размер приращения при вставке

      if(ArrayBt != nullptr) delete []ArrayBt;
      int lsize =  (int)wCounterB * (int)wSizeshB;
      ArrayBt = new char[lsize];
      file.read(ArrayBt, lsize);
      WINBTNSH2* par = (WINBTNSH2*)ArrayBt;
      ArrayStrBt.clear();
      QChar *qc = nullptr;
      // Чтение дополнительных параметров кнопок (рассматриваем вариант когда header.iVersion > 5)
      for(int i = 0; i < wCounterB; i++) {
          if(par[i].iText != 0) { // Есть текстовая строка
              if(qc) delete []qc;
              lsize = par[i].iText*2;
              qc = new QChar[lsize];
              file.read((char*)qc, lsize);
              ArrayStrBt << QString(qc, lsize/2);
           }
      }
    }

    wCounter = wSizesh = wIncrease = 0;
    if(gensh.hObjects) { // Есть список объектов
        file.read((char*)&wCounter, 2);  // Количество элементов
        file.read((char*)&wSizesh, 2); // Размер элемента внешний
        file.read((char*)&wIncrease, 2); // Размер приращения при вставке

        if(Array != nullptr) delete []Array;
        int lsize =  (int)wCounter * (int)wSizesh;
        Array = new char[lsize];
        file.read(Array, lsize);

        if(ArrayPointsh != nullptr) delete []ArrayPointsh;
        ArrayPointsh = new char[lsize]; // Временно для тестовой отладки!
        char* points = ArrayPointsh;

       ArrayStr.clear();
       QChar *qc = nullptr;

       if(ArrayFont != nullptr) delete []ArrayFont;  // Временно для тестовой отладки!
       ArrayFont = new LOGFONTI[wCounter];

       if(ArrayTrace != nullptr) delete ArrayTrace;  // Временно для тестовой отладки!
       ArrayTrace = new TRACE_SSH[wCounter];

       // Чтение дополнительных параметров объекта (рассматриваем вариант когда header.iVersion > 5)
        WINOBJSH3* par = (WINOBJSH3*)Array;
        for(int i = 0; i < wCounter; i++) {
            if(par[i].iText != 0) { // Есть текстовая строка
                if(qc) delete []qc;
                lsize = par[i].iText*2;
                qc = new QChar[lsize];
                file.read((char*)qc, lsize);
                ArrayStr << QString(qc, lsize/2);
             }
            if(par[i].hTrace != 0) { // Есть траектория
                file.read((char*)&ArrayTrace[i], sizeof(TRACE_SSH));
//                fseek(pfile, sizeof(TRACE_SSH), SEEK_CUR);
             }
            switch(par[i].iCode) {
            case 16: // Полигон WINOBJ_POLYGON
            case 17: // Полилайн WINOBJ_POLYLINE
                if(par[i].iPolyline == 0) break;
                lsize = par[i].iPolyline*sizeof(short)*2;
                file.read(points, lsize);
                points += lsize;
                break;
            case 18:  // Текстовая строка WINOBJ_STRING
            case 19:  // Текст WINOBJ_TEXT
                file.read((char*)&ArrayFont[i], sizeof(LOGFONTI));
//                file.seek(sizeof(LOGFONTI));
            }
        }
    }
    wCounterF = wSizeshF = wIncreaseF = 0;
    if(gensh.hAnimations) { // Есть список файлов FLI
        file.read((char*)&wCounterF, 2);  // Количество элементов
        file.read((char*)&wSizeshF, 2); // Размер элемента внешний
        file.read((char*)&wIncreaseF, 2); // Размер приращения при вставке

       if(ArrayFl != nullptr) delete []ArrayFl;
       int lsize =  (int)wCounterF * (int)wSizeshF;
       ArrayFl = new char[lsize];
       file.read(ArrayFl, lsize);
    }

    file.read((char*)&Rte, 4);
    file.close(); // Closes the file stream

    dumpWhs();
    return true;
}

int CWhs::checkWhs(QPoint p)
{
    WINOBJSH3* par = (WINOBJSH3*)Array;
    QPoint pt;
    QPolygon pl,pp;
    short* ptsh;
    char* points = ArrayPointsh;
    int lsize;
    short res = 0;

    for(int i = 0; i < wCounter; i++) {
        pp.clear();
        pl.clear();
        if(par[i].iView != gensh.iView) { // Отображение по номеру текщего слоя
            if(!(par[i].Flags & 0x8)) { // Flags. fALLVIEWS
                if((par[i].iCode == 16) || (par[i].iCode == 17)) { // Полигон или Полилайн
                    lsize = par[i].iPolyline*sizeof(short)*2;
                    points += lsize;
                }
                continue;
            }
        }
        if(!(par[i].Flags & 0x2))  continue; // Flags. fHIGHLIGHT
        if((par[i].iCode == 17)||  // Полилайн
        (par[i].iCode == 16)) { // Полигон
            ptsh = (short*)points;
            for(int k = 0; k < par[i].iPolyline; k++) {
                if(par[i].Flags & 0x100000) { // Flags.fFSCALE
                    pt.setX((*ptsh++)*par[i].dScale + par[i].x); pt.setY((*ptsh++)*par[i].dScale + par[i].y);
                }
                else {
                    pt.setX((*ptsh++) + par[i].x); pt.setY((*ptsh++) + par[i].y);
                }
                pl << pt;
            }
            pp << p;
            lsize = par[i].iPolyline*sizeof(short)*2;
            points += lsize;
//            if(pl.intersects(pp)) res = par[i].iIdentification;
            if(ptInPoly(p, pl)) res = par[i].iIdentification;
        }
        if((par[i].iCode > 4) && (par[i].iCode < 15)) { // Прямоугольник и ...
            if(!Select(par[i].x, par[i].y, par[i].sizSize[0]+ par[i].x, par[i].sizSize[1] + par[i].y, p.x(), p.y())) res = par[i].iIdentification;
//            pt.setX(par[i].x); pt.setY(par[i].y); pl << pt;
//            pt.setX(par[i].x+ par[i].sizSize[0]); pt.setY(par[i].y); pl << pt;
//            pt.setX(par[i].x+ par[i].sizSize[0]); pt.setY(par[i].y+ par[i].sizSize[1]); pl << pt;
//            pt.setX(par[i].x); pt.setY(par[i].y+ par[i].sizSize[1]); pl << pt;
//            pp << p;
//            if(pl.intersects(pp)) res = par[i].iIdentification;
//            if(ptInPoly(p, pl)) res = par[i].iIdentification;
        }
    }
    return res;
}

//double interpolate(double d0, double d11, double d12, double d21, double d22)
//{
//    if(d0 < d11) return d12;
//    if(d0 > d21) return d22;
//    double dsk = (d0 - d11)/(d21 - d11);
//    return (d22 - d12)*dsk + d12;
//}
short Hatch_Styles(short FillStyle) // 0 - 53
{
    short style = FillStyle;
    switch(style) {
    case 0: // HS_HORIZONTAL
    case 25: // GDI+
        return 9; // Qt::HorPattern
    case 1: // HS_VERTICAL
    case 24: // GDI+
        return 10; // Qt::VerPattern
    case 2: // HS_FDIAGONAL
    case 18: // GDI+
    case 20: // GDI+
    case 22: // GDI+
        return 13; // Qt::FDiagPattern
    case 3: // HS_BDIAGONAL
    case 19: // GDI+
    case 21: // GDI+
    case 23: // GDI+
        return 12; // Qt::BDiagPattern
    case 4: // HS_CROSS
        return 11; // Qt::CrossPattern
    case 5: // HS_DIAGCROSS
        return 14; // Qt::DiagCrossPattern
    case 6: // GDI+
    case 7: // GDI+
        return 2; // Qt::Dense1Pattern
    case 8: // GDI+
    case 9: // GDI+
        return 3; // Qt::Dense2Pattern
    case 10: // GDI+
    case 11: // GDI+
        return 4; // Qt::Dense3Pattern
    case 12: // GDI+
    case 13: // GDI+
        return 5; // Qt::Dense4Pattern
    case 14: // GDI+
    case 15: // GDI+
        return 6; // Qt::Dense5Pattern
    case 16: // GDI+
    case 17: // GDI+
        return 7; // Qt::Dense6Pattern
    }
    return 8; // Qt::Dense7Pattern
}
bool createWhsObjects() // Создание списка объектов Whs
{
    return true;
}
QPen getPen(WINOBJSH3* par, short &mode, QColor &back)
{
    QPen pen;
    mode = 0; // Qt::TransparentMode

    if((par->iCode == 18) || (par->iCode == 19)) { // Текстовая строка, Текст (WINOBJ_STRING, WINOBJ_TEXT)
        if(par->Flags & 0x10000) { // Flags.fFGDIPLUS
           pen.setColor(QColor(par->bFillColorR, par->bFillColorG, par->bFillColorB, par->bFillColorBr));
       }
       else {
           pen.setColor(QColor(par->bTextColorR, par->bTextColorG, par->bTextColorB));
           if(!(par->Flags & 0x80)) { // Flags.fBACKMODE
               mode = 1; // Qt::OpaqueMode
               back = QColor(par->bBackgroundR, par->bBackgroundG, par->bBackgroundB);
           }
       }
        return pen;
   }

    int Alpha = 255;
    if(par->bFrameColor != 0xFF) { // Цвет пера
        pen.setWidth(par->bWidth);
        pen.setStyle(Qt::PenStyle(par->bFrameStyle + 1));
        if(par->Flags & 0x10000) { // Flags.fFGDIPLUS
            if (par->Flags & 0x400000) Alpha = par->bPenBr; // Flags.fBACKMODEBR
        }
        pen.setColor(QColor(par->bFrameColorR, par->bFrameColorG, par->bFrameColorB, Alpha));
    }
    else pen = Qt::NoPen;
    return pen;
}
QBrush getBrush(WINOBJSH3* par, short &mode, QColor &back)
{
    mode = 0; // Qt::TransparentMode
    QBrush brush;
    if(par->Flags & 0x1000000)  {// Flags.fFTEXTURE
        QImage ind;
        QString str; str = par->szFile;
        if(str.contains(".PNG", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/PNG/" + str);
        else
        if(str.contains(".GIF", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/GIF/" + str);
        else
        if(str.contains(".JPG", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/JPG/" + str);
        else
        if(str.contains(".BMP", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/BMP/" + str);
        brush.setTextureImage(ind);
        return brush;
    }
    if(par->bFillColor != 0xFF) { // Цвет кисти
        QColor col1(par->bFillColorR, par->bFillColorG, par->bFillColorB);
        if(par->Flags & 0x400000) col1.setAlpha(par->bFillColorBr); // Flags.fBACKMODEBR
        QColor col2(par->bBackgroundR, par->bBackgroundG, par->bBackgroundB);
        if(par->Flags & 0x80) col2.setAlpha(par->bBackgroundBr); // Flags.fBACKMODE
        if(par->bFillStyle != 255)  { // Есть стиль Hatch_Styles
            brush = QBrush(col1, Qt::BrushStyle(Hatch_Styles((short)par->bFillStyle)));
            mode = 1; // Qt::OpaqueMode
            back = col2;
        }
        else
        if(par->Flags & 0x10000) { // Flags.fFGDIPLUS
            if(par->Flags & 0x40000) {// Flags.fFPATH
                QRadialGradient gradient(par->pBrushstart[0] + par->x, par->pBrushstart[1] + par->y, par->sizSize[1] / 2);
                gradient.setColorAt(0., col1);
                gradient.setColorAt(1., col2);
                brush = QBrush(gradient);
            }
            else {
                QLinearGradient gradient(par->pBrushstart[0] + par->x, par->pBrushstart[1] + par->y,
                                         par->pBrushend[0] + par->x, par->pBrushend[1] + par->y);
                gradient.setColorAt(0., col1);
                gradient.setColorAt(1., col2);
                brush = QBrush(gradient);
            }
        }
        else
        brush = QBrush(col1);
    }
    else brush = Qt::NoBrush;
    return brush;
}
void CWhs::showButtons(QWidget *parent)
{
    if(but.empty()) {
//        QPushButton* bt = new QPushButton("В НАЧАЛО", parent);
//        bt->move(127+1380, 1088);
//        bt->resize(129, 32);
//        bt->show();
//        but.append(bt);
          but.append(new QPushButton("ВЫХОД", parent)); but.at(0)->setFont(QFont("Times", 14));
          but.at(0)->move(1378, 1088); but.at(0)->resize(129, 32); but.at(0)->show();
          but.append(new QPushButton("В НАЧАЛО", parent)); but.at(1)->setFont(QFont("Times", 14));
          but.at(1)->move(1507, 1088); but.at(1)->resize(129, 32); but.at(1)->setEnabled(false);
          but.at(1)->show();
          but.append(new QPushButton("<<", parent)); but.at(2)->setFont(QFont("Arial", 20));
          but.at(2)->move(1636, 1088); but.at(2)->resize(129, 32); but.at(2)->show();
          but.append(new QPushButton(">>", parent)); but.at(3)->setFont(QFont("Arial", 20));
          but.at(3)->move(1765, 1088); but.at(3)->resize(129, 32); but.at(3)->setEnabled(false);
          but.at(3)->show();
    }
//    WINBTNSH2* par = (WINBTNSH2*)ArrayBt;
//    short n = 0;
//    for(int i = 0; i < wCounterB; i++) {
//    }
}

bool CWhs::createWhsObjects() // Создание списка объектов Whs
{
    if(wCounter == 0) return false;
    obj.clear();
    QColor back;
//    QImage ind;
    QPoint pt;
    QPolygon pl;
    short* ptsh;
    short mode;
    short n = -1;
    char* points = ArrayPointsh;
    int lsize;
    WINOBJSH3* par = (WINOBJSH3*)Array;

    for(int i = 0; i < wCounter; i++) {
        CWhsObject* pobj = new CWhsObject;
        if(pobj == nullptr) return false;
        if(par[i].iText != 0) n++;
        pobj->pen = getPen(&par[i], mode, back);
        pobj->iCode = par[i].iCode; // Код объекта
        pobj->iIdentification = par[i].iIdentification; // Код идентификации объекта
        pobj->iView = par[i].iView;  // Номер слоя
        pobj->Flags = par[i].Flags; // Поле индикаторов

        pobj->x = par[i].x; pobj->y = par[i].y; pobj->sx = par[i].sizSize[0]; pobj->sy = par[i].sizSize[1];


        if((par[i].iCode == 18) || (par[i].iCode == 19)) { // Текстовая строка, Текст (WINOBJ_STRING, WINOBJ_TEXT)
           QFont font;
           QString str(ArrayFont[i].lfFaceName);
           if(str.contains("!!!KURS", Qt::CaseInsensitive)) {
               font.setFamily(fkurs.first());
               if(ArrayFont[i].lfItalic) font.setItalic(true);
               if(ArrayFont[i].lfWeight > 400) font.setWeight(QFont::Medium);
               font.setPixelSize(-1*(ArrayFont[i].lfHeight));
           }
           else {
               font.setFamily(str);
               if(ArrayFont[i].lfItalic) font.setItalic(true);
               if(ArrayFont[i].lfWeight > 400) font.setWeight(QFont::Medium);
               font.setPixelSize(-1*(ArrayFont[i].lfHeight));
           }
           pobj->font = font;
           int flags = Qt::AlignTop | Qt::AlignLeft; // DT_LEFT| DT_TOP
           if(par[i].bStringAlignment & 0x1) flags = Qt::AlignHCenter|Qt::AlignVCenter; // DT_CENTER
           else
           if(par[i].bStringAlignment & 0x2) flags = Qt::AlignRight|Qt::AlignTop; // DT_RIGHT
           pobj->align = flags;  pobj->str = ArrayStr[n];
           pobj->mode = mode; pobj->background = back;
       }
       else
       if((par[i].iCode == 16) || (par[i].iCode == 17)) { // Полигон, Полилайн (WINOBJ_POLYGON, WINOBJ_POLYLINE)
           if(par[i].iPolyline == 0) continue;
           pl.clear();
           ptsh = (short*)points;
           for(int k = 0; k < par[i].iPolyline; k++) {
               if(par[i].Flags & 0x100000) { // Flags.fFSCALE
                   pt.setX((*ptsh++)*par[i].dScale + par[i].x); pt.setY((*ptsh++)*par[i].dScale_Y + par[i].y);
               }
               else {
                   pt.setX((*ptsh++) + par[i].x); pt.setY((*ptsh++) + par[i].y);
               }
               pl << pt;
           }
           pobj->pl = pl;
           lsize = par[i].iPolyline*sizeof(short)*2;
           points += lsize;
       }
       else
       if((par[i].iCode == 2) || (par[i].iCode == 22)) { // Файл BMP (WINOBJ_BITMAP, WINOBJ_JPG)
           QString str; str = par[i].szFile;
           if(str.contains(".PNG", Qt::CaseInsensitive)) pobj->ind.load("/home/peter/d/Distribs/30SM_LS/PNG/" + str/*, "PNG", Qt::ColorOnly*/);
           else
           if(str.contains(".GIF", Qt::CaseInsensitive)) pobj->ind.load("/home/peter/d/Distribs/30SM_LS/GIF/" + str);
           else
           if(str.contains(".JPG", Qt::CaseInsensitive)) pobj->ind.load("/home/peter/d/Distribs/30SM_LS/JPG/" + str);
           else
           if(str.contains(".BMP", Qt::CaseInsensitive)) pobj->ind.load("/home/peter/d/Distribs/30SM_LS/BMP/" + str);
           if(par[i].Flags & 0x100000) { // Flags.fFSCALE
               pobj->sx = par[i].sizSize[0] * par[i].dScale; pobj->sy = par[i].sizSize[1] * par[i].dScale_Y;
           }
       }
       else
       if(par[i].iCode == 15) { // Отрезок прямой линии (WINOBJ_LINE)
           pl.clear();
           pt.setX(par[i].x + par[i].Points[0]); pt.setY(par[i].y + par[i].Points[1]);  pl << pt;
           pt.setX(par[i].x + par[i].Points[2]); pt.setY(par[i].y + par[i].Points[3]);  pl << pt;
           pobj->pl = pl;
       }
       else
       if(par[i].iCode == 5) { // Прямоугольник (WINOBJ_RECTANGLE)
           pobj->brush = getBrush(&par[i], mode, back);
           pobj->mode = mode; pobj->background = back;
       }
       else
       if(par[i].iCode == 6) { // Скругленный прямоугольник (WINOBJ_ROUND)
           pobj->brush = getBrush(&par[i], mode, back);
           pobj->mode = mode; pobj->background = back;
           pl.clear();
           pt.setX(par[i].Points[0]); pt.setY(par[i].Points[1]);  pl << pt;
           pobj->pl = pl;
       }
       else
       if((par[i].iCode == 7) || (par[i].iCode == 11)) { // Эллипс, Окружность (WINOBJ_ELLIPSE, WINOBJ_CIRCLE)
           pobj->brush = getBrush(&par[i], mode, back);
           pobj->mode = mode; pobj->background = back;
       }
       else
       if((par[i].iCode == 8) || (par[i].iCode == 12)) { // Дуга эллипса, окружности (WINOBJ_EARC, WINOBJ_CARC)
           pl.clear();
           pt.setX((int)((360. - par[i].fAngleStart) * 16.)); pt.setY((int)((360. - par[i].fAngleEnd) * 16.));  pl << pt;
           pobj->pl = pl;
       }
       else
       if((par[i].iCode == 9) || (par[i].iCode == 13)) { // Сектор эллипса, окружности (WINOBJ_EPIE, WINOBJ_CPIE)
            pobj->brush = getBrush(&par[i], mode, back);
            pobj->mode = mode; pobj->background = back;
            pl.clear();
            pt.setX((int)((360. - par[i].fAngleStart) * 16.)); pt.setY((int)((360. - par[i].fAngleEnd) * 16.));  pl << pt;
            pobj->pl = pl;
       }
       else
       if((par[i].iCode == 10) || (par[i].iCode == 14)) { // Сегмент эллипса, окружности (WINOBJ_ECHORD, WINOBJ_CCHORD)
            pobj->brush = getBrush(&par[i], mode, back);
            pobj->mode = mode; pobj->background = back;
            pl.clear();
            pt.setX((int)((360. - par[i].fAngleStart) * 16.)); pt.setY((int)((360. - par[i].fAngleEnd) * 16.));  pl << pt;
            pobj->pl = pl;
        }
        obj.append(pobj);
    }
    return true;
}

void attributes_set(QPainter* p, WINOBJSH3* par, short hlight = 0)
{
    QPen pen;
    int Alpha = 255;

    if(hlight == par->iIdentification) {
        pen.setWidth(3);
        pen.setColor(QColor(255,255,0));
        pen.setStyle(Qt::SolidLine);
        p->setPen(pen);
    }
    else
    if(par->bFrameColor != 0xFF) { // Цвет пера
        pen.setWidth(par->bWidth);
        pen.setStyle(Qt::PenStyle(par->bFrameStyle + 1));
        if(par->Flags & 0x10000) { // Flags.fFGDIPLUS
            if (par->Flags & 0x400000) Alpha = par->bPenBr; // Flags.fBACKMODEBR
        }
        pen.setColor(QColor(par->bFrameColorR, par->bFrameColorG, par->bFrameColorB, Alpha));
        p->setPen(pen);
    }
    else p->setPen(Qt::NoPen);


    p->setBackgroundMode(Qt::TransparentMode);

    if(par->Flags & 0x1000000)  {// Flags.fFTEXTURE
        QImage ind;
//        QPixmap ind;
        QString str; str = par->szFile;
        if(str.contains(".PNG", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/PNG/" + str);
        else
        if(str.contains(".GIF", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/GIF/" + str);
        else
        if(str.contains(".JPG", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/JPG/" + str);
        else
        if(str.contains(".BMP", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/BMP/" + str);
//        QBrush brush;
//        brush.setTextureImage(ind);
//        brush.setStyle(Qt::SolidPattern);
//        p->setBrush(brush);
        p->setBrush(QBrush(ind));
        return;
    }

    if(par->bFillColor != 0xFF) { // Цвет кисти
        QColor col1(par->bFillColorR, par->bFillColorG, par->bFillColorB);
        if(par->Flags & 0x400000) col1.setAlpha(par->bFillColorBr); // Flags.fBACKMODEBR
        QColor col2(par->bBackgroundR, par->bBackgroundG, par->bBackgroundB);
        if(par->Flags & 0x80) col2.setAlpha(par->bBackgroundBr); // Flags.fBACKMODE
        if(par->bFillStyle != 255)  { // Есть стиль Hatch_Styles
            p->setBrush(QBrush(col1, Qt::BrushStyle(Hatch_Styles((short)par->bFillStyle))));
            p->setBackgroundMode(Qt::OpaqueMode);
            p->setBackground(col2);
        }
        else
        if(par->Flags & 0x10000) { // Flags.fFGDIPLUS
            if(par->Flags & 0x40000) {// Flags.fFPATH
                QRadialGradient gradient(par->pBrushstart[0] + par->x, par->pBrushstart[1] + par->y, par->sizSize[1] / 2);
                gradient.setColorAt(0., col1);
                gradient.setColorAt(1., col2);
                p->setBrush(gradient);
            }
            else {
                QLinearGradient gradient(par->pBrushstart[0] + par->x, par->pBrushstart[1] + par->y,
                                         par->pBrushend[0] + par->x, par->pBrushend[1] + par->y);
                gradient.setColorAt(0., col1);
                gradient.setColorAt(1., col2);
                p->setBrush(gradient);
            }
        }
        else
        p->setBrush(QBrush(col1));
    }
    else p->setBrush(Qt::NoBrush);
}
void CWhs::showWhs(QPainter* p)
{
    QImage ind;
    QPoint pt;
    QPolygon pl;
    QPen pen;
    char* points = ArrayPointsh;
    int lsize;
//    if(Array == nullptr) return;
    WINOBJSH3* par = (WINOBJSH3*)Array;
    short* ptsh;
    short n = -1;
    int nlight = -1; // Номер объекта с комментарием (см. hlight)

    Window_Animation* pan = (Window_Animation*)ArrayFl;
    QString str,stn;
    for(int i = 0; i < wCounterF; i++) {
        str = "Объект N: " +  QString::number(i+1);
        stn = pan[i].szFile;
        str += ", Имя файла: " +  stn + "\n";
    }
    if(wCounterF > 0) {
        QFont font = p->font();
        font.setPixelSize(20);
        p->setFont(font);
        p->setBackgroundMode(Qt::TransparentMode);
        p->drawText(0, 0, gensh.siSize[0], gensh.siSize[1], Qt::AlignHCenter|Qt::AlignVCenter, str);
    }

    for(int i = 0; i < wCounter; i++) {
        pen.setWidth(par[i].bWidth);
        if(par[i].iText != 0) n++;

        if(!(par[i].Flags & 0x10)) { // Flags.fVISIBLE
           if(hlight != par[i].iIdentification) {
               if((par[i].iCode == 16) || (par[i].iCode == 17)) { // Полигон или Полилайн
                   lsize = par[i].iPolyline*sizeof(short)*2;
                   points += lsize;
               }
               continue;
           }
       }
        if(par[i].iView != gensh.iView) { // Отображение по номеру текщего слоя
            if(!(par[i].Flags & 0x8)) { // Flags. fALLVIEWS
                if((par[i].iCode == 16) || (par[i].iCode == 17)) { // Полигон или Полилайн
                    lsize = par[i].iPolyline*sizeof(short)*2;
                    points += lsize;
                }
                continue;
            }
        }
        if(hlight == par[i].iIdentification) {
            if(par[i].Flags & 0x1) // Flags.fACTIVE
                if(par[i].iText != 0) { // Есть комментарий
                    nlight = i;
                    stn = ArrayStr[n];
                }
        }

        if((par[i].iCode == 18) || (par[i].iCode == 19)) { // Текстовая строка, Текст (WINOBJ_STRING, WINOBJ_TEXT)
            if(par[i].Flags & 0x10000) { // Flags.fFGDIPLUS
               pen.setColor(QColor(par[i].bFillColorR, par[i].bFillColorG, par[i].bFillColorB/*, par[i].bFillColorBr*/));
               p->setBackgroundMode(Qt::TransparentMode);
           }
           else {
               pen.setColor(QColor(par[i].bTextColorR, par[i].bTextColorG, par[i].bTextColorB));
               if(par[i].Flags & 0x80) { // Flags.fBACKMODE
                   p->setBackgroundMode(Qt::TransparentMode);
               }
               else {
                   p->setBackgroundMode(Qt::OpaqueMode);
                   p->setBackground(QColor(par[i].bBackgroundR, par[i].bBackgroundG, par[i].bBackgroundB));
               }
           }
           QFont font;
           QString str(ArrayFont[i].lfFaceName);
           if(str.contains("!!!KURS", Qt::CaseInsensitive)) {
               font.setFamily(fkurs.first());
               if(ArrayFont[i].lfItalic) font.setItalic(true);
               if(ArrayFont[i].lfWeight > 400) font.setWeight(QFont::Medium);
               font.setPixelSize(-1*(ArrayFont[i].lfHeight));
           }
           else {
               font.setFamily(str);
               if(ArrayFont[i].lfItalic) font.setItalic(true);
               if(ArrayFont[i].lfWeight > 400) font.setWeight(QFont::Medium);
               font.setPixelSize(-1*(ArrayFont[i].lfHeight));
           }
           p->setFont(font);
 /*
#define TA_LEFT 0
#define TA_TOP 0
#define TA_RIGHT 2
#define TA_CENTER 6
#define TA_BOTTOM 8
#define TA_BASELINE 24
*/
           int flags = Qt::AlignTop | Qt::AlignLeft; // DT_LEFT| DT_TOP
           if(par[i].bStringAlignment & 0x1) flags = Qt::AlignHCenter|Qt::AlignVCenter; // DT_CENTER
           else
           if(par[i].bStringAlignment & 0x2) flags = Qt::AlignRight|Qt::AlignTop; // DT_RIGHT
           /*if(par[i].bStringAlignment & 0x10)*/ flags |= Qt::TextWordWrap; // DT_WORDBREAK
           p->setPen(pen);
           p->drawText(par[i].x, par[i].y, par[i].sizSize[0], par[i].sizSize[1], flags, ArrayStr[n]);
       }
       else
       if(par[i].iCode == 16) { // Полигон (WINOBJ_POLYGON)
           if(par[i].iPolyline == 0) continue;
           attributes_set(p, &par[i], hlight);
           pl.clear();
           ptsh = (short*)points;
           for(int k = 0; k < par[i].iPolyline; k++) {
               if(par[i].Flags & 0x100000) { // Flags.fFSCALE
                   pt.setX((*ptsh++)*par[i].dScale + par[i].x); pt.setY((*ptsh++)*par[i].dScale_Y + par[i].y);
               }
               else {
                   pt.setX((*ptsh++) + par[i].x); pt.setY((*ptsh++) + par[i].y);
               }
               pl << pt;
           }
           p->drawPolygon(pl);
           lsize = par[i].iPolyline*sizeof(short)*2;
           points += lsize;
       }
       else
       if(par[i].iCode == 17) { // Полилайн (WINOBJ_POLYLINE)
           if(par[i].iPolyline == 0) continue;
           attributes_set(p, &par[i], hlight);
           pl.clear();
           ptsh = (short*)points;
           for(int k = 0; k < par[i].iPolyline; k++) {
               if(par[i].Flags & 0x100000) { // Flags.fFSCALE
                   pt.setX((*ptsh++)*par[i].dScale + par[i].x); pt.setY((*ptsh++)*par[i].dScale_Y + par[i].y);
               }
               else {
                   pt.setX((*ptsh++) + par[i].x); pt.setY((*ptsh++) + par[i].y);
               }
               pl << pt;
           }
           p->drawPolyline(pl);
           lsize = par[i].iPolyline*sizeof(short)*2;
           points += lsize;
       }
       else
       if((par[i].iCode == 2) || (par[i].iCode == 22)) { // Файл BMP (WINOBJ_BITMAP, WINOBJ_JPG)
           QString str; str = par[i].szFile;
           if(str.contains(".PNG", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/PNG/" + str);
           else
           if(str.contains(".GIF", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/GIF/" + str);
           else
           if(str.contains(".JPG", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/JPG/" + str);
           else
           if(str.contains(".BMP", Qt::CaseInsensitive)) ind.load("/home/peter/d/Distribs/30SM_LS/BMP/" + str);
           if(par[i].Flags & 0x100000) { // Flags.fFSCALE
               p->drawImage(QRect(par[i].x, par[i].y, par[i].sizSize[0] * par[i].dScale, par[i].sizSize[1] * par[i].dScale_Y), ind);
           }
           else
           p->drawImage(par[i].x, par[i].y, ind);
       }
       else
       if(par[i].iCode == 15) { // Отрезок прямой линии (WINOBJ_LINE)
           attributes_set(p, &par[i], hlight);
           p->drawLine(par[i].x + par[i].Points[0], par[i].y + par[i].Points[1], par[i].x + par[i].Points[2], par[i].y + par[i].Points[3]);
       }
       else
       if(par[i].iCode == 5) { // Прямоугольник (WINOBJ_RECTANGLE)
           attributes_set(p, &par[i], hlight);
           p->drawRect(par[i].x, par[i].y, par[i].sizSize[0], par[i].sizSize[1]);
       }
       else
       if(par[i].iCode == 6) { // Скругленный прямоугольник (WINOBJ_ROUND)
           attributes_set(p, &par[i], hlight);
           p->drawRoundedRect(par[i].x, par[i].y, par[i].sizSize[0], par[i].sizSize[1], (qreal)par[i].Points[0], (qreal)par[i].Points[1], Qt::AbsoluteSize);
       }
       else
       if((par[i].iCode == 7) || (par[i].iCode == 11)) { // Эллипс, Окружность (WINOBJ_ELLIPSE, WINOBJ_CIRCLE)
           attributes_set(p, &par[i], hlight);
           p->drawEllipse(par[i].x, par[i].y, par[i].sizSize[0], par[i].sizSize[1]);
       }
       else
       if((par[i].iCode == 8) || (par[i].iCode == 12)) { // Дуга эллипса, окружности (WINOBJ_EARC, WINOBJ_CARC)
           attributes_set(p, &par[i], hlight);
           p->drawArc(par[i].x, par[i].y, par[i].sizSize[0], par[i].sizSize[1], (360 - par[i].fAngleStart) * 16, (360 - par[i].fAngleEnd) * 16);
       }
        if((par[i].iCode == 9) || (par[i].iCode == 13)) { // Сектор эллипса, окружности (WINOBJ_EPIE, WINOBJ_CPIE)
            attributes_set(p, &par[i], hlight);
            p->drawPie(par[i].x, par[i].y, par[i].sizSize[0], par[i].sizSize[1], (360 - par[i].fAngleStart) * 16, (360 - par[i].fAngleEnd) * 16);
        }
        if((par[i].iCode == 10) || (par[i].iCode == 14)) { // Сегмент эллипса, окружности (WINOBJ_ECHORD, WINOBJ_CCHORD)
            attributes_set(p, &par[i], hlight);
            p->drawChord(par[i].x, par[i].y, par[i].sizSize[0], par[i].sizSize[1], (360 - par[i].fAngleStart) * 16, (360 - par[i].fAngleEnd) * 16);
        }
    }
    if(nlight > -1) {
        int i = nlight;
        QFont font;
        font.setFamily("Arial");
        font.setPixelSize(19);
        font.setWeight(QFont::Medium);
        p->setFont(font);
        QFontMetrics fm = p->fontMetrics();
        QSize sz = fm.size(Qt::TextShowMnemonic, stn); // interprets "&x" as x; i.e., underlined
        p->setBackgroundMode(Qt::TransparentMode);
        int flags = Qt::AlignTop | Qt::AlignLeft | Qt::TextWordWrap;
        pen.setColor(QColor(Qt::black)); pen.setWidth(2);
        p->setPen(pen);
        p->setBrush(QColor(255,255,215));
        int x = par[i].x;
        int y = par[i].y + par[i].sizSize[1] + 4;
        if(par[i].Flags & 0x100000) y = par[i].y + par[i].sizSize[1]*par[i].dScale; // Flags.fFSCALE
        if((y + sz.height() + 4 ) > height) y = par[i].y - sz.height() - 8;
        if(y < 0) y = 0;
        if((x + sz.width() + 8) > width) x = width - sz.width() - 8;
        if(x < 0) x = 0;
        p->drawRect(x, y, sz.width() + 8, sz.height() + 4);
        p->drawText(x + 2, y + 2, sz.width(), sz.height(), flags, stn);
    }
}
